#!/usr/bin/python
# -*- coding: UTF-8 -*-
# Filename: insurance.py
# 保险的案例：目的：未来来个新的人，可以通过模型来预测他的医疗花销；所以，就把charges列作为y，其他列作为X维度

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# 读取文件
data = pd.read_csv('./insurance.csv')
# 输出数据的类型
print("type(data)=\n", type(data))
# 输出数据的前5行，可以自定义前n行
print("data.head=\n", data.head())
# 输出数据的后5行，可以自定义前n行
print("data.tail=\n", data.tail())
# describe做简单的统计摘要，如一共多少行
print("data.describe=\n", data.describe())

# 采样要均匀
data_count = data['age'].value_counts()
# print("data_count=\n", data_count)
data_count[:10].plot(kind='bar')
# 直接显示图
# plt.show()
# 把计算绘制的图保存
# plt.savefig('./temp')

# corr: correlative: 列的相关性
print("data.corr=\n", data.corr())

reg = LinearRegression()
x = data[['age', 'sex', 'bmi', 'children', 'smoker', 'region']]
y = data['charges']
# python3.6 报错 sklearn ValueError: could not convert string to float: 'northwest'，加入一下几行解决
x = x.apply(pd.to_numeric, errors='coerce')
y = y.apply(pd.to_numeric, errors='coerce')
# 把为空的数据填充成0
x.fillna(0, inplace=True)
y.fillna(0, inplace=True)
# 进行升维操作设置，x的幂次最高为3
poly_features = PolynomialFeatures(degree=3, include_bias=False)
# 升维
X_poly = poly_features.fit_transform(x)

reg.fit(X_poly, y)
print(reg.coef_)
print(reg.intercept_)

y_predict = reg.predict(X_poly)

plt.plot(x['age'], y, 'b.')
plt.plot(X_poly[:, 0], y_predict, 'r.')
plt.show()

"""
Q：为什么每行没有人名？
A：人名不会对最终的Y结果产生影响，所以可以不用

Q：为什么要观测注意数据多样性，采样要均匀？
A：就是因为你要的模型的功能是对任何年龄段的人都有一个好的预测，那么你的模型在训练的时候
   读取的数据集，就得包含各个年龄段得数据，而且各个年龄段也得数据均匀，防止过拟合！

Q：什么是Pearson相关系数？
A：Pearson相关系数是来测量两组变量之间的线性相关性的！Pearson相关系数的区间范围是-1到1之间
   如果越接近于-1，说明两组变量越负相关，一个变大，另一个变小，反之如果越接近于1，说明两组
   变量越正相关，一个变大，另一个也跟着变大，如果越接近于0，说明越不相关，即一个变大或变小，
   另一个没什么影响！
   通过Pearson相关系数，如果发现两个维度之间，相关系数接近于1，可以把其中一个去掉，做到降维！
   通过Pearson相关系数，如果发现某个维度和结果Y之间的相关系数接近于0，可以把这个维度去掉，降维！
"""
